/**数字精准计算
 * type:1加法 0减法 2乘法  3除法
 * @param {*} num1 
 * @param {*} num2 
 * @param {*} type 
 */

function formatFloat(num1, num2, type) { 
  var result = 0
  if (type === 2) {
    var m = 0
    var s1 = num1.toString()
    var s2 = num2.toString()
    try {
      m += s1.split('.')[1].length
    } catch (e) {
    }
    try {
      m += s2.split('.')[1].length
    } catch (e) {
    }
    result = Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
  } else if (type === 3) {
    var t1 = 0
    var t2 = 0
    var r1, r2
    try {
      t1 = num1.toString().split('.')[1].length
    } catch (e) {
    }
    try {
      t2 = num2.toString().split('.')[1].length
    } catch (e) {
    }
    r1 = Number(num1.toString().replace('.', ''))
    r2 = Number(num2.toString().replace('.', ''))
    result = (r1 / r2) * Math.pow(10, t2 - t1)
  } else {
    var numa = num1.toString()
    var numb = num2.toString()
    var lena = 0
    var lenb = 0
    var lastLen = 0
    if (numa.indexOf('.') > 0) {
      lena = numa.split('.')[1].length
    }
    if (numb.indexOf('.') > 0) {
      lenb = numb.split('.')[1].length
    }

    if (lena > lenb) {
      lastLen = lena
      numa = Number(num1) * Math.pow(10, lena)
      numb = Number(num2) * Math.pow(10, lena)
    } else {
      lastLen = lenb
      numa = num1 * Math.pow(10, lenb)
      numb = num2 * Math.pow(10, lenb)
    }

    // 做相应的加减乘除(这里只做加法运算,其他差不多)
    if (type === 1) {
      result = Number(numa) + Number(numb)
    } else if (type === 0) {
      result = Number(numa) - Number(numb)
    }
    result = result / Math.pow(10, lastLen)
  }
  return result
}

// 日期展示格式处理
    // 对Date的扩展，将 Date 转化为指定格式的String
    // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
    // 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
    // 例子：
    // this.dateFormatByFmt(dateObj,"yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
    // this.dateFormatByFmt(dateobj,"yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
    function dateFormatByFmt (dd, fmt) {
      let date = new Date()
      if (this.isEmpty(date)) {
        return ''
      } else {
        date = new Date(dd)
      }
      var o = {
        'M+': date.getMonth() + 1, // 月份
        'd+': date.getDate(), // 日
        'h+': date.getHours(), // 小时
        'm+': date.getMinutes(), // 分
        's+': date.getSeconds(), // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        'S': date.getMilliseconds() // 毫秒
      }
      if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) }
      for (var k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }
      }
      return fmt
    }
    /**
     * 比较两个对象是否相等
     * @param {*} objA 
     * @param {*} objB 
     */
   function isObjEqual (objA, objB) {
      var aProps = Object.getOwnPropertyNames(JSON.parse(JSON.stringify(objA)))
      var bProps = Object.getOwnPropertyNames(JSON.parse(JSON.stringify(objB)))
      if (aProps.length !== bProps.length) {
        return false
      }
      for (var i = 0; i < aProps.length; i++) {
        var propName = aProps[i]

        var propA = objA[propName]
        var propB = objB[propName]
        if ((typeof (propA) === 'object')) {
          if (this.isObjEqual(propA, propB)) {
            // return true     这里不能return ,后面的对象还没判断
          } else {
            return false
          }
        } else if (propA !== propB) {
          return false
        } else { }
      }
      return true
    }

    // 判断是否为空
   function isEmpty (val) {
      var flag = val === undefined || val === null || val === '' || val === 0
      if (!flag) {
        if (val instanceof Array) {
          flag = val.length === 0
        } else if (val instanceof Object) {
          flag = Object.getOwnPropertyNames(JSON.parse(JSON.stringify(val))).length === 0
        }
      }
      return flag
    }
    /**
     * 合并两个对象
     * @param {*} objA 
     * @param {*} objB 
     */
    Vue.prototype.objAssign = function (objA, objB) {
      if (this.isEmpty(objA)) return objB
      if (this.isEmpty(objB)) return objA

      // 判断
      if (objA instanceof Object && objB instanceof Object) {
        var keys = Object.keys(objB)
        for (var i = 0; i < keys.length; i++) {
          var valB = objB[keys[i]]
          var valA = objA[keys[i]]
          if (this.isEmpty(valA) && !this.isEmpty(valB)) {
            objA[keys[i]] = valB
          }
        }
      }
      return objA
    }

    /**
     * 图片转成base64
     * @param {*} e 对象
     */
      function imgToBase64(e) {
      // 使用Promise进行异步处理
      return new Promise((resolve, reject) => {
        // 获取图片文件对象
        let file
        if (e.target) {
          file = e.target.files[0]
        } else {
          file = e
        }
        if (file) {
          // 获取图片大小
          let fileSize = file.size
          // 设置图片最大为 1M
          let fileMaxSize = 1024
          let size = fileSize / 1024
          // 实例化一个对象
          let reader = new FileReader()
          if (size > fileMaxSize) {
            resolve({ err: '图片大小必须小于1M！' })
          } else if (size <= 0) {
            resolve({ err: '图片大小大小不能为0M！' })
          } else {
            // 把图片文件对象转换base64
            if (file.raw instanceof File) {
              reader.readAsDataURL(file.raw)
            } else {
              reader.readAsDataURL(file)
            }
            reader.onload = (e) => {
              resolve({file: file, base64: e.target.result}) // 回到函数返回base64值
            }
          }
        }
      })
    }

    /**
     * formData 处理
     * info 基础信息 Object、Array
     * uploads 上传信息 Object
     */
  function formData (info, uploads, uName) {
      var _self = this

      // 默认处理
      if (this.isEmpty(uName)) {
        uName = 'uploadFiles'
      }

      // 1. 创建 FormData
      let form = new window.FormData()
      // 2. 保存基础信息
      if (!_self.isEmpty(info)) {
        if (info instanceof Object || info instanceof Array) {
          form.append('info', JSON.stringify(info))
        } else {
          form.append('info', info)
        }
      }
      // 3. 处理上传文件
      if (!_self.isEmpty(uploads)) {
        // 3.1. 解析文件对象
        Object.keys(uploads).forEach(item => {
          let val = uploads[item]
          // 3.2. 上传数据不能为空
          if (!_self.isEmpty(val)) {
            if (val instanceof Array) {
              val.filter(n_item => (n_item instanceof File || n_item.raw instanceof File)) // eslint-disable-line
                .forEach(n_item => { // eslint-disable-line
                  const f = (n_item.raw ? n_item.raw : n_item)// eslint-disable-line
                  form.append(uName, f, item + '&#v#&' + f.name)
                })
            } else {
              const f = (val.raw ? val.raw : val)
              form.append(uName, f, f.name)
            }
          }
        })
      }
      return form
    }

    /**
     * 下载文件
     * @param {*} params 请求参数
     */
   function downloadFile (params) {
      if (!this.isEmpty(params)) {
        this.$http.post(this.globalUrl.downloadKey, params, {emulateJSON: false, responseType: 'arraybuffer'}).then((res) => {
          // 获取后台文件名称，未获取到下载数据为空
          let contentDisposition = res.headers.get('content-disposition')
          // console.log(contentDisposition)
          if (contentDisposition) {
            let fileName = window.decodeURI(contentDisposition.split('=UTF-8')[1], 'UTF-8').replace('\'\'', '')
            // console.log(fileName)
            if (!this.isEmpty(fileName)) {
              // 创建 a 标签 下载数据
              const a = document.createElement('a')
              document.body.appendChild(a)
              const url = window.URL.createObjectURL(new Blob([res.data], {type: res.headers.get('content-type')}))
              a.href = url
              a.download = fileName
              a.click()
              setTimeout(() => {
                window.URL.revokeObjectURL(url)
                document.body.removeChild(a)
              }, 0)
            }
          } else {
            this.$message.error('下载失败')
          }
        })
      }
    }
  

export default{
  formatFloat,
  dateFormatByFmt,
  isObjEqual,
  downloadFile
}